{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 微调树的参数：max_depth & min_child_weight\n",
    "(微调，将步长降为1，进行精细调整)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# path to where the data lies\n",
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath +\"RentListingInquries_FE_train.csv\")\n",
    "# train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 准备数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train = train['interest_level']\n",
    "\n",
    "train = train.drop(['interest_level'], axis=1, inplace = False)\n",
    "X_train = train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2026: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "# 训练样本6w+，交叉验证太慢，用train_test_split估计模型性能\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train_part, X_val, y_train_part, y_val = train_test_split(X_train, y_train, train_size = 0.2,random_state = 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(9870, 227)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_part.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "各类样本不均衡，交叉验证是采用StratifiedKFold，在每折采样时各类样本按比例采样"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# prepare cross validation\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': [5, 6, 7], 'min_child_weight': [2, 3, 4]}"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#max_depth 建议3-10， min_child_weight=1／sqrt(ratio_rare_event) =5.5\n",
    "max_depth = [5,6,7]\n",
    "min_child_weight = [2,3,4]\n",
    "param_test2_1 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test2_1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.62865, std: 0.00864, params: {'max_depth': 5, 'min_child_weight': 2},\n",
       "  mean: -0.62768, std: 0.00826, params: {'max_depth': 5, 'min_child_weight': 3},\n",
       "  mean: -0.62724, std: 0.00866, params: {'max_depth': 5, 'min_child_weight': 4},\n",
       "  mean: -0.62690, std: 0.01005, params: {'max_depth': 6, 'min_child_weight': 2},\n",
       "  mean: -0.62656, std: 0.00769, params: {'max_depth': 6, 'min_child_weight': 3},\n",
       "  mean: -0.62853, std: 0.00859, params: {'max_depth': 6, 'min_child_weight': 4},\n",
       "  mean: -0.63002, std: 0.00752, params: {'max_depth': 7, 'min_child_weight': 2},\n",
       "  mean: -0.62977, std: 0.00992, params: {'max_depth': 7, 'min_child_weight': 3},\n",
       "  mean: -0.62699, std: 0.00818, params: {'max_depth': 7, 'min_child_weight': 4}],\n",
       " {'max_depth': 6, 'min_child_weight': 3},\n",
       " -0.6265610097718766)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb2_1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=104,  #第一轮参数调整得到的n_estimators最优值\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.5,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=5)\n",
    "\n",
    "\n",
    "gsearch2_1 = GridSearchCV(xgb2_1, param_grid = param_test2_1, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch2_1.fit(X_train_part , y_train_part)\n",
    "\n",
    "gsearch2_1.grid_scores_, gsearch2_1.best_params_,     gsearch2_1.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([47.21908426, 47.57034392, 47.62739091, 57.16448946, 56.63968391,\n",
       "        56.35644078, 65.88156099, 65.66553898, 61.4641778 ]),\n",
       " 'std_fit_time': array([0.69408801, 0.18221418, 0.40191011, 0.13055601, 0.21718194,\n",
       "        0.22333585, 0.28585056, 0.18201926, 5.62605405]),\n",
       " 'mean_score_time': array([0.09315171, 0.09255433, 0.09434948, 0.1095088 , 0.11110411,\n",
       "        0.11170177, 0.12307167, 0.12347054, 0.10731454]),\n",
       " 'std_score_time': array([0.00249144, 0.00074559, 0.00401899, 0.00443233, 0.00982422,\n",
       "        0.0066165 , 0.00162024, 0.00540435, 0.0112588 ]),\n",
       " 'param_max_depth': masked_array(data=[5, 5, 5, 6, 6, 6, 7, 7, 7],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_min_child_weight': masked_array(data=[2, 3, 4, 2, 3, 4, 2, 3, 4],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'max_depth': 5, 'min_child_weight': 2},\n",
       "  {'max_depth': 5, 'min_child_weight': 3},\n",
       "  {'max_depth': 5, 'min_child_weight': 4},\n",
       "  {'max_depth': 6, 'min_child_weight': 2},\n",
       "  {'max_depth': 6, 'min_child_weight': 3},\n",
       "  {'max_depth': 6, 'min_child_weight': 4},\n",
       "  {'max_depth': 7, 'min_child_weight': 2},\n",
       "  {'max_depth': 7, 'min_child_weight': 3},\n",
       "  {'max_depth': 7, 'min_child_weight': 4}],\n",
       " 'split0_test_score': array([-0.63518165, -0.6315406 , -0.6306548 , -0.63328932, -0.6296444 ,\n",
       "        -0.63487042, -0.63589523, -0.63716502, -0.63416736]),\n",
       " 'split1_test_score': array([-0.64072808, -0.64004414, -0.6406599 , -0.64360808, -0.63873418,\n",
       "        -0.6412954 , -0.64101108, -0.64317534, -0.63692463]),\n",
       " 'split2_test_score': array([-0.6234652 , -0.62124878, -0.62134255, -0.62057277, -0.62266285,\n",
       "        -0.62643189, -0.62459193, -0.63011129, -0.6278961 ]),\n",
       " 'split3_test_score': array([-0.61613355, -0.61629456, -0.61512433, -0.61703679, -0.61546965,\n",
       "        -0.61717927, -0.62026246, -0.6151161 , -0.61473867]),\n",
       " 'split4_test_score': array([-0.62773363, -0.62926017, -0.62840576, -0.61999266, -0.62629226,\n",
       "        -0.62285184, -0.6283557 , -0.6232591 , -0.62123738]),\n",
       " 'mean_test_score': array([-0.62864918, -0.62767788, -0.6272377 , -0.62690127, -0.62656101,\n",
       "        -0.62852698, -0.63002404, -0.62976678, -0.62699414]),\n",
       " 'std_test_score': array([0.00863652, 0.00826158, 0.00865665, 0.01004996, 0.00769395,\n",
       "        0.00858654, 0.00752039, 0.00991605, 0.00817593]),\n",
       " 'rank_test_score': array([7, 5, 4, 2, 1, 6, 9, 8, 3]),\n",
       " 'split0_train_score': array([-0.47675862, -0.48152857, -0.48508926, -0.40803572, -0.41969232,\n",
       "        -0.42851468, -0.34516335, -0.35993402, -0.37481849]),\n",
       " 'split1_train_score': array([-0.4712204 , -0.47782046, -0.4830566 , -0.41122066, -0.42254965,\n",
       "        -0.43151966, -0.34505395, -0.36114249, -0.37164406]),\n",
       " 'split2_train_score': array([-0.47885667, -0.4839907 , -0.48922238, -0.41131563, -0.42444264,\n",
       "        -0.43299806, -0.34826463, -0.3664234 , -0.37558331]),\n",
       " 'split3_train_score': array([-0.47646113, -0.48336427, -0.48741123, -0.41071942, -0.42546408,\n",
       "        -0.43534161, -0.34729205, -0.36545291, -0.37643022]),\n",
       " 'split4_train_score': array([-0.47785856, -0.48256936, -0.48805293, -0.41209229, -0.4214857 ,\n",
       "        -0.43247569, -0.34793968, -0.36652506, -0.37848601]),\n",
       " 'mean_train_score': array([-0.47623108, -0.48185467, -0.48656648, -0.41067675, -0.42272688,\n",
       "        -0.43216994, -0.34674273, -0.36389557, -0.37539242]),\n",
       " 'std_train_score': array([0.00264502, 0.00217869, 0.00221262, 0.00139174, 0.00205993,\n",
       "        0.00221912, 0.00137092, 0.00279295, 0.0022389 ])}"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gsearch2_1.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.626561 using {'max_depth': 6, 'min_child_weight': 3}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# summarize results\n",
    "print(\"Best: %f using %s\" % (gsearch2_1.best_score_, gsearch2_1.best_params_))\n",
    "test_means = gsearch2_1.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch2_1.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch2_1.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch2_1.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "pd.DataFrame(gsearch2_1.cv_results_).to_csv('my_preds_maxdepth_min_child_weights_1.csv')\n",
    "\n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(max_depth), len(min_child_weight))\n",
    "train_scores = np.array(train_means).reshape(len(max_depth), len(min_child_weight))\n",
    "\n",
    "for i, value in enumerate(min_child_weight):\n",
    "    pyplot.plot(max_depth, -test_scores[i], label= 'test_min_child_weight:'   + str(value))\n",
    "# for i, value in enumerate(min_child_weight):\n",
    "#     pyplot.plot(max_depth, -train_scores[i], label= 'train_min_child_weight:'   + str(value))\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'max_depth' )                                                                                                      \n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig('max_depth_vs_min_child_weght_1.png' )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "当前调参结果：  \n",
    "最优max_depth为6；   \n",
    "最优min_child_weight为3。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
